package cn.tedu.demo1;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * Spring核心框架，是一个Bean容器。帮我们管理项目中使用到的类。
 */
public class Demo {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        //需求：使用Person类的sayHello方法
        /**
        硬编码：自己new，然后调方法
        优点：性能好，简单
        缺点：耦合度高
         */
        Person person = new Person();
        person.sayHello();

        /**
         * 反射机制
         * 优点：解耦合，代码灵活
         * 缺点：性能低，代码复杂，编写很多的复杂的反射代码
         */
        Class clazz = Class.forName("cn.tedu.demo1.Person");
        Person person1 = (Person) clazz.newInstance();
        person1.sayHello();

        /*
        使用Spring容器
        使用容器后，有一个模式发生了改变，就是当我们需要使用到一个类的实例时，
        从原本我们主动实例化（无论是硬编码还是反射）现在转变为项容器“要对象使用。
        这种转变：
        原来，我们使用税，实例化谁这个操作的控制代码由我们自己编写。
        现在转变为向容器要，这意味着对象的实例化（对象的初始化）的控制由容器来完成。
        这就是IoC（控制反转）
         */
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("cn.tedu.demo1");
        Person p1 = context.getBean(Person.class);
        p1.sayHello();
    }
}
